Drought · Thermal Stress Indicator

TCI – Temperature Condition Index

TCI (Temperature Condition Index) measures thermal stress by comparing current land surface temperature to its long-term minimum and maximum, and is widely used in drought and vegetation stress monitoring.

1. Scientific Definition

The Temperature Condition Index (TCI) is a standardized thermal index derived from land surface temperature (LST) time series. It indicates whether current conditions are unusually hot or cool relative to the historical range.

Formula

TCI = (LSTmax − LSTcurrent) / (LSTmax − LSTmin)

  • LSTcurrent – current land surface temperature
  • LSTmax – long-term maximum LST
  • LSTmin – long-term minimum LST

Interpretation (0–1)

  • TCI ≈ 1 → cool / favorable thermal conditions (low stress)
  • TCI ≈ 0.5 → normal thermal conditions
  • TCI ≈ 0 → hot / strong thermal stress (possible drought)

Applications

  • Agricultural and ecological drought monitoring
  • Vegetation stress and heatwave studies
  • Combined with VCI to build VHI (Vegetation Health Index)

2. Data Requirements

LST Datasets (example)

  • MODIS – MOD11A2 (Terra, 8-day, 1 km LST_Day_1km)
  • Other LST products (Landsat, ECOSTRESS, ERA5-Land LST, etc.)

Temporal Dimension

  • Multi-year LST time series to compute LSTmin and LSTmax
  • TCI can be computed for a given month/season or specific date range

Suggested Palette

[ "#b2182b", "#ef8a62", "#fddbc7", "#d1e5f0", "#67a9cf", "#2166ac" ]

3. Google Earth Engine Code – TCI (from MODIS LST)


// TCI – Temperature Condition Index
// TCI = (LST_max - LST_current) / (LST_max - LST_min)

// AOI
var roi = geometry;
Map.centerObject(roi, 6);

// 1. Load MODIS LST (Terra, 8-day, 1 km)
var lstCol = ee.ImageCollection("MODIS/061/MOD11A2")
  .filterBounds(roi)
  .filterDate("2010-01-01", "2025-01-01")
  .select("LST_Day_1km");

// MODIS LST scale: 0.02 K. Convert to °C.
function toCelsius(img) {
  var lstK = img.select("LST_Day_1km").multiply(0.02);
  var lstC = lstK.subtract(273.15).rename("LST_C");
  return lstC.copyProperties(img, img.propertyNames());
}

var lstCCol = lstCol.map(toCelsius);

// 2. Build long-term min and max LST
var lstStats = lstCCol.reduce(ee.Reducer.min().combine({
  reducer2: ee.Reducer.max(),
  sharedInputs: true
}));

var lstMin = lstStats.select("LST_C_min");
var lstMax = lstStats.select("LST_C_max");

// 3. Select target period for TCI (e.g. a specific season / year)
var targetStart = "2023-06-01";
var targetEnd   = "2023-08-31";

var lstTarget = lstCCol
  .filterDate(targetStart, targetEnd)
  .mean()
  .clip(roi)
  .rename("LST_current");

// 4. Compute TCI = (LST_max - LST_current) / (LST_max - LST_min)
var tci = lstMax.subtract(lstTarget)
  .divide(lstMax.subtract(lstMin))
  .rename("TCI")
  .clip(roi);

// Optional: clamp to [0,1]
tci = tci.clamp(0, 1);

// 5. Visualization
var vis = {
  min: 0,
  max: 1,
  palette: [
    "#b2182b", "#ef8a62", "#fddbc7",
    "#d1e5f0", "#67a9cf", "#2166ac"
  ]
};

Map.addLayer(tci, vis, "TCI (Temperature Condition Index)");

// 6. Optional: thermal stress mask (e.g. TCI < 0.3)
var thermalStress = tci.lt(0.3).selfMask();
Map.addLayer(thermalStress, {palette:["#b2182b"]}, "High Thermal Stress (TCI < 0.3)", false);

// 7. Export TCI
Export.image.toDrive({
  image: tci,
  description: "TCI_export",
  fileNamePrefix: "TCI_MODIS_2023_summer",
  region: roi,
  scale: 1000,   // MODIS ~1 km
  crs: "EPSG:4326",
  maxPixels: 1e13
});